//-----------------------------------------------------------------------
// <copyright file="PropertyMatcherTest.cs" company="NMock2">
//
//   http://www.sourceforge.net/projects/NMock2
//
//   Licensed under the Apache License, Version 2.0 (the "License");
//   you may not use this file except in compliance with the License.
//   You may obtain a copy of the License at
//
//       http://www.apache.org/licenses/LICENSE-2.0
//
//   Unless required by applicable law or agreed to in writing, software
//   distributed under the License is distributed on an "AS IS" BASIS,
//   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//   See the License for the specific language governing permissions and
//   limitations under the License.
// </copyright>
// This is the easiest way to ignore StyleCop rules on this file, even if we shouldn't use this tag:
// <auto-generated />
//-----------------------------------------------------------------------
namespace NMock2.Test.Matchers
{
    using NMock2.Matchers;
    using NUnit.Framework;

    [TestFixture]
    public class PropertyMatcherTest
    {
        [Test]
        public void MatchesObjectWithNamedPropertyAndMatchingPropertyValue()
        {
            ObjectWithProperties o = new ObjectWithProperties();
            object aValue = new NamedObject("aValue");
            o.A = aValue;

			Matcher m = new PropertyMatcher("A", NMock2.Is.Same(aValue));
            
            Assert.IsTrue(m.Matches(o), "should match o");
        }

        [Test]
        public void DoesNotMatchObjectIfPropertyMatcherDoesNotMatch()
        {
            ObjectWithProperties o = new ObjectWithProperties();
            object aValue = new NamedObject("aValue");
            object otherValue = new NamedObject("otherValue");
            o.A = aValue;
            
            Matcher m = new PropertyMatcher("A", new SameMatcher(otherValue) );
            
            Assert.IsFalse(m.Matches(o), "should not match o");
        }

        [Test]
        public void DoesNotMatchObjectIfItDoesNotHaveNamedProperty()
        {
            ObjectWithProperties o = new ObjectWithProperties();
            
            Matcher m = new PropertyMatcher("OtherProperty", new AlwaysMatcher(true,"anything"));

            Assert.IsFalse(m.Matches(o), "should not match o");
        }

    
        [Test]
        public void DoesNotMatchWriteOnlyProperty()
        {
            ObjectWithProperties o = new ObjectWithProperties();
            
            Matcher m = new PropertyMatcher("WriteOnlyProperty", new AlwaysMatcher(true,"anything"));

            Assert.IsFalse(m.Matches(o), "should not match o");
        }
    
        [Test]
        public void DoesNotMatchPrivateProperty()
        {
            ObjectWithProperties o = new ObjectWithProperties();
            
            Matcher m = new PropertyMatcher("PrivateProperty", new AlwaysMatcher(true,"anything"));

            Assert.IsFalse(m.Matches(o), "should not match o");
        }

        [Test]
        public void HasAReadableDescription()
        {
            Matcher matcher = new EqualMatcher("foo");

            AssertDescription.IsEqual(new PropertyMatcher("A", matcher), "property 'A' " + matcher.ToString());
        }

        public class ObjectWithProperties
        {
            private object a;

            public object A
            {
                get { return a; }
                set { a = value; }
            }

            public object WriteOnlyProperty
            {
                set {}
            }

            private object PrivateProperty
            {
                get { return "value"; }
                set {}
            }

            public void AMethodToGetAroundCompilerWarnings()
            {
                this.PrivateProperty = "something";
            }
        }
    }
}
